// 文件名：stack_vm_call_frames.cpp
// 目的：模拟虚拟机/解释器的调用栈（call stack），用 std::stack 管理函数帧（Frame）。
// 设计：
//   - Frame：包含函数名、程序计数器 pc、局部变量数量 locals 等基础调试信息；
//   - 使用 std::stack<Frame, std::vector<Frame>>：以 vector 作为底层容器，具备连续内存、良好缓存局部性；
//   - pushFrame(name, locals)：入栈新帧并初始化 pc=0；
//   - popFrame()：出栈栈顶帧（返回时打印从哪个函数返回）；
//   - current()：返回当前帧引用，以便修改 pc 或其他字段。
// 行为：模拟 main -> foo -> bar 的调用与返回顺序，包含一次下溢（underflow）演示。
// 复杂度：push/pop/top/size 均摊 O(1)。
// 注意：
//   - 调用 current() 前需确保栈非空，否则调用 top() 未定义行为；
//   - 真正的 VM 会在栈帧中保存更多状态（实参、返回地址、寄存器快照等）；
//   - 可扩展：在 pushFrame 中接受初始 pc / 返回地址等参数。

#include <iostream>
#include <stack>
#include <string>
#include <vector>

struct Frame {
    std::string functionName;
    int pc;        // program counter
    int locals;    // number of locals
};

int main() {
    std::stack<Frame, std::vector<Frame>> callStack;

    auto pushFrame = [&](std::string name, int locals) {
        callStack.emplace(Frame{name, 0, locals});
        std::cout << "Call " << name << ", stack depth = " << callStack.size() << '\n';
    };

    auto popFrame = [&]() {
        if (callStack.empty()) {
            std::cerr << "Stack underflow!\n";
            return;
        }
        std::cout << "Return from " << callStack.top().functionName << '\n';
        callStack.pop();
    };

    auto current = [&]() -> Frame& {
        return callStack.top();
    };

    pushFrame("main", 2);
    current().pc = 10;

    pushFrame("foo", 1);
    current().pc = 3;

    pushFrame("bar", 0);
    current().pc = 5;
    popFrame();

    current().pc = 7;
    popFrame();

    popFrame();
    popFrame(); // will report underflow

    return 0;
}